package com.echo.im.client.helper;

import com.echo.im.common.model.IMUserInfo;
import com.echo.im.common.enums.IMTerminalType;

import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 在线状态接口，用于处理用户在线状态的相关操作
 * @author echo
 */
public interface OnlineStatus {

    /**
     * 根据用户ID列表获取对应用户的信息，同时标记哪些用户处于离线状态
     *
     * @param userIds 用户ID列表
     * @param offlineUserIds 离线用户的ID集合，用于标记用户是否在线
     * @return 包含用户信息的映射，键为服务器ID，值为用户信息列表
     */
    Map<Integer, List<IMUserInfo>> getServerIdUserInfoMap(List<Long> userIds, Set<Long> offlineUserIds);

    /**
     * 根据用户ID列表获取用户信息，不区分用户是否在线
     *
     * @param userIds 用户ID列表
     * @return 包含用户信息的映射，键为服务器ID，值为用户信息列表
     */
    Map<Integer, List<IMUserInfo>> getServerIdUserInfoMap(List<Long> userIds);

    /**
     * 获取指定用户ID列表的在线终端类型
     *
     * @param userIds 用户ID列表
     * @return 包含用户在线终端类型的映射，键为用户ID，值为终端类型列表
     */
    public Map<Long, List<IMTerminalType>> getOnlineTerminal(List<Long> userIds);

    /**
     * 检查用户是否在线
     *
     * @param userId 用户ID
     * @return 用户是否在线，在线返回true，离线返回false
     */
    public Boolean isUserOnline(Long userId) ;

    /**
     * 获取在线用户列表
     *
     * @param userIds 用户ID列表
     * @return 在线用户ID的列表
     */
    public List<Long> getOnlineUser(List<Long> userIds);

    /**
     * 根据用户ID和终端类型列表，获取当前用户在线的serverID以及其上在线的设备类型
     *
     * @param userId 用户ID
     * @param terminals 终端类型列表
     * @return 包含在线终端的映射，键为服务器ID，值为终端ID列表
     */
    Map<Integer, List<Integer>> getServerIdTerminalListMap(Long userId, List<Integer> terminals);
}
